# 1、写函数,将传入的列表或元祖对象的奇数位索引对应的元素
def ele(obj):
    result = [] #首先创建了一个空列表 result。这个列表将用于存储满足特定条件的元素。
    for i in range(len(obj)): #for 循环遍历从 0 到 len(obj)-1 的整数序列。range(len(obj)) 生成的是对象 obj 的所有有效索引值的序列
        if i%2!=0:
            result.append(obj[i])
    return result
# print(ele([1, 2, 3, 4, 5]))



# 2、写函数,判断用户传入的对象(string,list,tuple)长度是否大于5
# 方法一
def dayuwu(obj):
    if isinstance(obj,(str,list,tuple)): #使用 isinstance() 函数检查 obj 是否是 str、list 或 tuple 类型之一。
        return len(obj)>5
    return False
# print(dayuwu("as"))
#方法二
def obj_len(obj):
    if isinstance(obj,str):
        if len(obj)>5:
            print(f'传入的字符串:{obj},长度大于5')
        else:
            print(f'传入的字符串:{obj},长度小于5')
    if isinstance(obj,list):
        if len(obj)>5:
            print(f'传入的列表:{obj},长度大于5')
        else:
            print(f'传入的列表:{obj},长度小于5')
    if isinstance(obj,tuple):
        if len(obj)>5:
            print(f'传入的元组:{obj},长度大于5')
        else:
            print(f'传入的元组:{obj},长度小于5')
"""
obj_len("abcdasd") #字符串
obj_len([1,1,1,1,1,1,1]) #列表
obj_len([1])  #列表
obj_len((1,2,3,4,5,6,7))  #元组
"""


#3、写函数,计算传入的string中,数字,字母,空格以及其它内容的个数,并返回结果
# 方法一
# def count_characters(s):
#     digits = 0
#     letters = 0
#     spaces = 0
#     others = 0
#     for char in s:
#         if char.isdigit():
#             digits += 1
#         elif char.isalpha():
#             letters += 1
#         elif char.isspace():
#             spaces += 1
#         else:
#             others += 1
#     return digits, letters, spaces, others
# 方法二
def count_characters(obj):
    space=0
    letter=0
    digits=0
    other=0
    for i in obj:
        if i in '0123456789':
            digits+=1
        elif i=="":
            space+=1
        elif(i>='a'and i<='z')or (i>='A'and i<='Z'):
            letter+=1
        else:
            other+=1
    return digits, letter, space, other
# print(count_characters("dcvbnghj23456   5 (&"))



# 4、写函数,接收两个数字参数,返回较大的那个数字
# 方式一
def find_max(num1, num2):
    return max(num1, num2)
# 方式二
def find_max(num1,num2):
    if num1>num2:
        return num1
    elif num1<num2:
        return num2
    else:    #elif num1 == num2 else就是剩下的条件了，代码里不用写条件，elif后面需要写判断条件
        return "两数字相等"
# print(find_max(10,30))

#5、编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
# def cacluate(*args):
#     if not args:
#         return (0, 0, 0, 0)
#     total = sum(args)
#     average = total / len(args)
#     max_num = max(args)
#     min_num = min(args)
#     return (total, average, max_num, min_num)
def cacluate(*args):
    return args
# *args 允许你将不定数量的位置参数传递给一个函数。
# 在函数定义中使用 *args 时，所有传递给该函数的额外位置参数都会被收集到一个元组（tuple）中，这个元组可以通过变量 args 来访问。
# *args 只是用来接收额外的位置参数，如果你需要处理关键字参数（即命名参数），你应该使用 **kwargs。
# *args 是一种用于函数定义的特殊语法，允许函数接受任意数量的位置参数。
# args 本身只是一个普通的变量名，除非在其前加上 *，否则它不具备收集参数的能力。


# # 6、编写一个函数, 接收字符串参数, 返回一个元组,元组的第一个值为大写字母的个数, 第二个值为小写字母个数.
# def count_letter(data):
#     bigletter_count=0
#     smallletter_count=0
#     for i in data:
#         if i.isupper():
#             bigletter_count+=1
#         else:
#             smallletter_count+=1
#         return bigletter_count,smallletter_count
# user_input=input("请输入内容")
# if count_letter(user_input):
#     print(f"输入的内容为: {user_input}，是大写")
# else:
#     print(f"输入的内容:{user_input},是小写")
def tuple_ele(str1):
    daixezimu=0
    xiaoxiezimu=0
    for i in str1:
        if i>='a'and i<='z':
            xiaoxiezimu+=1
        elif i>='A'and i<='Z':
            daixezimu+=1
    return daixezimu,xiaoxiezimu
# print(tuple_ele('ASDFGhjhjh8999 ij'))


# 7、编写函数, 接收一个列表(包含30个1~100之间的随机整形数)和一个整形数k, 返回一个新列表.
# 函数需求:
# 将列表下标k之前对应(不包含k)的元素逆序;
# 将下标k及之后的元素逆序;
from random import randint #导入了 randint 函数，这是用于生成指定范围内随机整数的函数
def reverse_list(lst, k):
    if len(lst)==30:
     return lst[:k][::-1] + lst[k:][::-1]
    # 前半部分k之前逆序 后半部分k之后元素逆序
    else:
        return []
ran_list=[randint(1,100) for i in range(30)]
""""
randint(1,100):生成从1到100之间的随机数字
for i in range(30):循环30次
[randint(1,100) for i in range(30)]:把每一次随机生成的数字
"""
# print(ran_list)
# print(reverse_list([56, 36, 70, 55, 86, 45, 10, 65, 60, 73, 53, 50, 51, 22, 42, 85, 75, 68, 55, 26, 40, 85, 43, 43, 31, 64, 35, 76, 39, 78],5))
#8、编写函数，从键盘输入参数x和n，计算并显示形如x+xx +xxx + xxxx + xxxxx+xxx…xxx+ 的表达式前n项的值

# def calculate_sum():
#     x = input("请输入数字 x: ")
#     n = int(input("请输入项数 n: "))
#     total = 0
#     for i in range(1, n + 1):
#         term = int(x * i)
#         total = total + term
#     print(f"表达式前 {n} 项的和为: {total}")
# calculate_sum()

# # 9、写函数,函数接收的4个参数分别是:姓名,性别(默认为男),年龄,地址
# def person_info(name, age, address, gender='男'):
#     print(f"姓名: {name}")
#     print(f"性别: {gender}")
#     print(f"年龄: {age}")
#     print(f"地址: {address}")

# 10、写函数,接收n个数字,返回这些数字的和(动态传参)
# 方式一
def sum(*args):
    return sum(args)
# 方式二
def n_(*n):
    sum = 0
    for i in n:
        sum += i
    return sum
# # 11、在实参中传入多个可迭代对象(要有string,list,tuple,set,dict),将每个对象的每个元素都加到args或kwargs里
def obj(*args,**kwagrs):
    print(args)
    print(kwagrs)
"""
*args 允许你将不定数量的位置参数传递给一个函数。
在函数定义中使用 *args 时，所有传递给该函数的额外位置参数都会被收集到一个元组（tuple）中，这个元组可以通过变量 args 来访问。
*args 只是用来接收额外的位置参数，如果你需要处理关键字参数（即命名参数），你应该使用 **kwargs。
*args 是一种用于函数定义的特殊语法，允许函数接受任意数量的位置参数。
args 本身只是一个普通的变量名，除非在其前加上 *，否则它不具备收集参数的能力。
"""
# # 12、写函数,把传过来的列表中的每一个元素都用"_"拼接,并返回
# # 13、写函数,传入一个数字,返回这个数的阶乘。示例：1x2x3....
# def jiecheng(n):
#     if n < 0:
#         return None
#     result = 1
#     for i in range(1, n + 1):
#         result *= i
#     return result
#
#
# # 14、写函数,返回一个扑克牌列表,里面有52项,每一项都是一个tuple
# # 15、编写函数，求1+2+3+…N的和
# def sum(n):
#     return n * (n + 1) / 2
# # 16、编写一个函数，求多个数中的最大值
# def find_max(*args):
#     if not args:
#         return None
#     max_num = args[0]
#     for num in args[1:]:
#         if num > max_num:
#             max_num = num
#     return max_num
# # 17、编写一个函数，提取指定字符串中所有的字母，然后拼接在一起产生一个新的字符串
#
# # 18、写一个函数，求多个数的平均值
# def average(*args):
#     if not args:
#         return 0
#     total = sum(args)
#     return total / len(args)
# # 19、写一个自己的len函数，统计指定序列中元素的个数
# def my_len(obj):
#     count = 0
#     for i in obj:
#         count += 1
#     return count
# # 20、找出传入的列表或元组的奇数位对应的元素，并返回一个新的列表
# def get_elements(sequence):
#     return [sequence[i] for i in range(1, len(sequence), 2)]
# # 21、水仙花数：个位、十位、百位的立方加在一起等于数的本身
# def shuixianhua():
#     numbers = []
#     for num in range(100, 1000):
#         a = num /100
#         b = (num /10) % 10
#         c = num % 10
#         if a *3 + b * 3 + c * 3 == num:
#             numbers.append(num)
#     return numbers
#
# # 22、 定义函数，有一个形参，传入的是列表，数组大小不超过 100个，
# # 数组中的每个元素值不允许超过 100，但是可以等于100，
# # 如果列表大小超过了100个截取到第100个为止，要求返回的列表格式：
# # 删除所有重复元素，使得每个元素只出现一次
# # 按照数字的大小，由高到低排序返回
# # 23、定义函数 getLength，打印用户传入的容器类型和数据长度
# # 24、定义函数 generateNum( )
# # 25、定义函数 moreThan(num)，判断输入的数字是否大于1500
# def moreThan(num):
#     return num > 1500
# # 26、定义函数，有两个形参，第一个形参到第二个形参的范围，所有平方数之和
# def sum(start, end):
#     total = 0
#     for i in range(start, end + 1):
#         total += i ** 2
#     return total
# # 27、写函数，检查传入字典的每一个value长度，如果大于2，
# # 那么仅保留前两个长度的内容， 并将新内容返回给调用者
# #  28、写函数，判断用户传入的对象（字符串、列表、元组）的元素是否为空
# # 29、编写自定义函数，完成一个简单的减法运算函数
# def numbers(num1, num2):
#     return num1 - num2
# # 30、编写自定义函数，可以输出自己的名字即可。
# def print_myname():
#     print("这里填写你的名字")
# # 31、编写自定义函数：剪刀石头布
# # 游戏开始，初始状态下用户和电脑都有 100 分，赢一局+10 分，输一局-10 分。
# # 当用户为 0 分时，游戏结束，提示游戏结束，比赛输了
# # 当用户为 200 分时，游戏结束，提示游戏结束，赢得比赛、每轮比赛都输出当前的分数
# # 1 代表剪刀 2 代表石头 3 代表布
# # 32、编写一个函数，接受一个字符串作为参数，并返回该字符串的逆序字符串
# def reverse_string(s):
#     return s[::-1]
# # 33、编写一个函数，接受一个数字列表作为参数，并返回其中所有偶数的列表
# def even_numbers(numbers):
#     return [num for num in numbers if num % 2 == 0]
# # 34、编写一个函数，接受一个字符串列表作为参数，并返回其中最长的字符串。
# def longest_string(strings):
#     if not strings:
#         return None
#     return max(strings, key=len)
# # 35、编写一个函数，接受一个数字列表作为参数，并返回其中所有数字的平方的总和
# def sum(numbers):
#     return sum(x ** 2 for x in numbers)
# # 36、编写一个函数，接受一个字符串作为参数，并返回其中所有单词的首字母的大写形式
# def word(s):
#     return s.title()
#
#
# # 37、编写一个函数，接受两个列表作为参数，并返回两个列表的交集
# # 举例：
# # list1 = [100,200,300,454]
# # list2 = [454,789,125,46]
# # 返回：[454]
# def list(list1, list2):
#     return list(set(list1) & set(list2))
# list1 = [100,200,300,454]
# list2 = [454,789,125,46]
# print(list(list1, list2))
# #  38、定义一个学生注册函数enroll()，打印学生姓名，性别，年龄，城市
# def enroll(name, gender='男',age=18,city='chongqing'):
#     print(f"姓名: {name}")
#     print(f"性别: {gender}")
#     print(f"年龄: {age}")
#     print(f"地址: {city}")